package com.zzyl.nursing.service.impl;

import java.util.Arrays;
import java.util.Date;
import java.util.List;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.zzyl.common.core.domain.AjaxResult;
import com.zzyl.oss.AliyunOssUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import com.zzyl.nursing.mapper.CateringFeedbackMapper;
import com.zzyl.nursing.domain.CateringFeedback;
import com.zzyl.nursing.service.ICateringFeedbackService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.web.multipart.MultipartFile;

/**
 * 用餐反馈Service业务层处理
 *
 * @Author: alexis
 * @Date: 2024-12-30
 */
@Service
@Slf4j
@RequiredArgsConstructor
public class CateringFeedbackServiceImpl extends ServiceImpl<CateringFeedbackMapper, CateringFeedback> implements ICateringFeedbackService {

    private final CateringFeedbackMapper cateringFeedbackMapper;
    private final AliyunOssUtils aliyunOssUtils;

    /**
     * 查询用餐反馈
     *
     * @param id 用餐反馈主键
     * @return 用餐反馈
     */
    @Override
    public CateringFeedback selectCateringFeedbackById(Long id) {
        CateringFeedback feedback = cateringFeedbackMapper.selectById(id);
        if (feedback != null && StrUtil.isNotBlank(feedback.getFeedbackImages())) {
            feedback.setFeedbackImages(processImageUrl(feedback.getFeedbackImages()));
        }
        return feedback;
    }

    /**
     * 查询用餐反馈列表
     *
     * @param cateringFeedback 用餐反馈
     * @return 用餐反馈集合
     */
    @Override
    public List<CateringFeedback> selectCateringFeedbackList(CateringFeedback cateringFeedback) {
        List<CateringFeedback> list = cateringFeedbackMapper.selectCateringFeedbackList(cateringFeedback);
        // 处理图片URL
        for (CateringFeedback feedback : list) {
            if (StrUtil.isNotBlank(feedback.getFeedbackImages())) {
                feedback.setFeedbackImages(processImageUrl(feedback.getFeedbackImages()));
            }
        }
        return list;
    }

    /**
     * 新增用餐反馈
     *
     * @param cateringFeedback 用餐反馈
     * @return 结果
     */
    @Override
    public int insertCateringFeedback(CateringFeedback cateringFeedback) {
        // 数据校验
        validateFeedback(cateringFeedback);
        return cateringFeedbackMapper.insert(cateringFeedback);
    }

    /**
     * 修改用餐反馈
     *
     * @param cateringFeedback 用餐反馈
     * @return 结果
     */
    @Override
    public int updateCateringFeedback(CateringFeedback cateringFeedback) {
        // 数据校验
        validateFeedback(cateringFeedback);
        return cateringFeedbackMapper.updateById(cateringFeedback);
    }

    /**
     * 批量删除用餐反馈
     *
     * @param ids 需要删除的用餐反馈主键集合
     * @return 结果
     */
    @Override
    public int deleteCateringFeedbackByIds(Long[] ids) {
        return cateringFeedbackMapper.deleteBatchIds(Arrays.asList(ids));
    }

    /**
     * 删除用餐反馈信息
     *
     * @param id 用餐反馈主键
     * @return 结果
     */
    @Override
    public int deleteCateringFeedbackById(Long id) {
        return cateringFeedbackMapper.deleteById(id);
    }

    /**
     * 回复用餐反馈
     *
     * @param cateringFeedback 用餐反馈
     * @return 结果
     */
    @Override
    public int replyCateringFeedback(CateringFeedback cateringFeedback) {
        if (cateringFeedback.getId() == null) {
            throw new RuntimeException("反馈ID不能为空");
        }

        if (StrUtil.isBlank(cateringFeedback.getResponseContent())) {
            throw new RuntimeException("回复内容不能为空");
        }

        // 设置处理状态为已处理
        cateringFeedback.setStatus(1);

        return cateringFeedbackMapper.updateById(cateringFeedback);
    }

    /**
     * 根据老人ID查询反馈列表
     *
     * @param elderlyId 老人ID
     * @return 用餐反馈集合
     */
    @Override
    public List<CateringFeedback> selectFeedbackByElderId(Long elderlyId) {
        List<CateringFeedback> list = cateringFeedbackMapper.selectFeedbackByElderId(elderlyId);
        // 处理图片URL
        for (CateringFeedback feedback : list) {
            if (StrUtil.isNotBlank(feedback.getFeedbackImages())) {
                feedback.setFeedbackImages(processImageUrl(feedback.getFeedbackImages()));
            }
        }
        return list;
    }

    /**
     * 根据处理状态查询反馈列表
     *
     * @param status 处理状态
     * @return 用餐反馈集合
     */
    @Override
    public List<CateringFeedback> selectFeedbackByStatus(Integer status) {
        List<CateringFeedback> list = cateringFeedbackMapper.selectFeedbackByStatus(status);
        // 处理图片URL
        for (CateringFeedback feedback : list) {
            if (StrUtil.isNotBlank(feedback.getFeedbackImages())) {
                feedback.setFeedbackImages(processImageUrl(feedback.getFeedbackImages()));
            }
        }
        return list;
    }

    /**
     * 上传反馈图片
     *
     * @param file 图片文件
     * @return 上传结果
     */
    @Override
    public AjaxResult uploadFeedbackImage(MultipartFile file) {
        try {
            if (file == null || file.isEmpty()) {
                return AjaxResult.error("请选择要上传的图片");
            }

            // 检查文件类型
            String originalFilename = file.getOriginalFilename();
            if (originalFilename == null || !isValidImageFile(originalFilename)) {
                return AjaxResult.error("只支持jpg、jpeg、png、gif格式的图片");
            }

            // 检查文件大小（限制为5MB）
            if (file.getSize() > 5 * 1024 * 1024) {
                return AjaxResult.error("图片大小不能超过5MB");
            }

            // 上传到阿里云OSS
            String imageUrl = aliyunOssUtils.uploadFile(file);
            if (StrUtil.isBlank(imageUrl)) {
                return AjaxResult.error("图片上传失败");
            }

            return AjaxResult.success("图片上传成功", imageUrl);
        } catch (Exception e) {
            log.error("上传反馈图片失败", e);
            return AjaxResult.error("图片上传失败：" + e.getMessage());
        }
    }

    /**
     * 处理图片URL
     */
    @Override
    public String processImageUrl(String imageUrl) {
        if (StrUtil.isBlank(imageUrl)) {
            return imageUrl;
        }
        // 如果已经是完整URL，直接返回
        if (imageUrl.startsWith("http://") || imageUrl.startsWith("https://")) {
            return imageUrl;
        }
        // 否则直接返回，因为uploadFile已经返回完整URL
        return imageUrl;
    }

    /**
     * 验证图片文件格式
     */
    private boolean isValidImageFile(String filename) {
        String lowerCaseFilename = filename.toLowerCase();
        return lowerCaseFilename.endsWith(".jpg") || 
               lowerCaseFilename.endsWith(".jpeg") || 
               lowerCaseFilename.endsWith(".png") || 
               lowerCaseFilename.endsWith(".gif");
    }

    /**
     * 数据校验
     */
    private void validateFeedback(CateringFeedback cateringFeedback) {
        if (cateringFeedback.getElderlyId() == null) {
            throw new RuntimeException("老人ID不能为空");
        }

        if (cateringFeedback.getMenuDate() == null) {
            throw new RuntimeException("用餐日期不能为空");
        }

        if (cateringFeedback.getMealType() == null) {
            throw new RuntimeException("餐次类型不能为空");
        }

        if (cateringFeedback.getMealType() < 1 || cateringFeedback.getMealType() > 4) {
            throw new RuntimeException("餐次类型不正确（1：早餐，2：午餐，3：晚餐，4：加餐）");
        }

        if (StrUtil.isBlank(cateringFeedback.getFeedbackContent())) {
            throw new RuntimeException("反馈内容不能为空");
        }

        if (cateringFeedback.getSatisfactionLevel() != null && 
            (cateringFeedback.getSatisfactionLevel() < 1 || cateringFeedback.getSatisfactionLevel() > 5)) {
            throw new RuntimeException("满意度评分必须在1-5分之间");
        }

        if (cateringFeedback.getStatus() == null) {
            cateringFeedback.setStatus(0); // 默认未处理
        }
    }
} 